001    /*
002     * Created by IntelliJ IDEA.
003     * User: Wei Wang
004     * Date: 2002-9-12
005     * Time: 13:58:40
006     * To change template for new class use 
007     * Code Style | Class Templates options (Tools | IDE Options).
008     */
009    package EVolve.util;
010    
011    import EVolve.visualization.*;
012    import EVolve.Scene;
013    import javax.swing.*;
014    import javax.swing.event.InternalFrameAdapter;
015    import javax.swing.event.InternalFrameEvent;
016    import java.awt.geom.Point2D;
017    import java.awt.image.BufferedImage;
018    import java.awt.*;
019    
020    
021    public class Magnifier implements Cloneable{
022        private JInternalFrame window;
023        private JDesktopPane desktop;
024        private AxesPanel magnifiedPanel;
025        private Point2D.Double mousePosition;
026        private Rectangle imageBounds;
027        private boolean flipImage;
028    
029        public Magnifier(boolean flipImage) {
030            window = null;
031            desktop = Scene.getUIManager().getDesktop();
032            mousePosition = new Point2D.Double(-1,-1);
033            this.flipImage = flipImage;
034        }
035    
036        private void createWindow() {
037            if (window == null) {
038                window = new JInternalFrame("Zoomed View");
039                window.addInternalFrameListener(new InternalFrameAdapter() {
040                    public void internalFrameClosing(InternalFrameEvent e) {
041                        window = null;
042                    }
043                });
044                /*window.addInternalFrameListener(new InternalFrameAdapter() {
045                    public void internalFrameDeactivated(InternalFrameEvent e) {
046                        cleanup();
047                    }
048                });*/
049                window.setClosable(true);
050                int flag = AxesPanel.Pointer_Enabled | AxesPanel.Scale_Image;
051                if (flipImage)
052                    flag = flag | AxesPanel.Flip_Image;
053                magnifiedPanel = new AxesPanel(flag);
054                window.setBounds(desktop.getSize().width - 400, 0, 300, 300);
055                window.setResizable(true);
056                window.getContentPane().add(magnifiedPanel);
057                desktop.add(window);
058                mousePosition.setLocation(magnifiedPanel.getWidth()/2,magnifiedPanel.getHeight()/2);
059            }
060            window.moveToFront();
061            window.setVisible(true);
062        }
063    
064        public void showWindow(BufferedImage subImage) {
065            createWindow();
066    
067            int w = magnifiedPanel.getWidth();
068            int h = magnifiedPanel.getHeight();
069            if ((w*h != 0)&&(subImage!=null)) {
070                imageBounds = new Rectangle(0,0,subImage.getWidth(),subImage.getHeight());
071    
072                magnifiedPanel.setImage(subImage);
073                magnifiedPanel.setPointerPosition((int)Math.round(mousePosition.x), (int)Math.round(mousePosition.y));
074                magnifiedPanel.repaint();
075                if (!window.isVisible()) {
076                    try {
077                        window.show();
078                        window.setVisible(true);
079                    } catch (Exception e) {}
080                }
081            }
082        }
083    
084        public void convertMousePosition(AxesPanel zoomed) {
085            if ((magnifiedPanel == null) || (magnifiedPanel.getWidth() == 0)) {
086                return;
087            }
088            int w = magnifiedPanel.getWidth(), h = magnifiedPanel.getHeight();
089    
090    
091            Point2D.Double mousePos = zoomed.getMouseMovement();
092            //double pixel_x_size = (double)zoomed.getWidth()/imageBounds.getWidth();
093            //double pixel_y_size = (double)zoomed.getHeight()/imageBounds.getHeight();
094    
095            int guessX = 0, guessY = 0;
096            while (guessX<w) {
097                if (magnifiedPanel.getImageX(guessX) == mousePos.x) break;
098                guessX++;
099            }
100            while (guessY<h){
101                if (magnifiedPanel.getImageY(guessY) == mousePos.y) break;
102                guessY++;
103            }
104    
105            mousePosition.setLocation(guessX+3,guessY+3);
106        }
107    
108        public void cleanup() {
109            try {
110                window.dispose();
111                window.setVisible(false);
112                window = null;
113            } catch (Exception e) {}
114        }
115    
116        public Object clone() {
117            Magnifier o = null;
118            try {
119                o = (Magnifier)super.clone();
120            } catch (CloneNotSupportedException e) {
121                e.printStackTrace();
122                return null;
123            }
124            o.magnifiedPanel = (AxesPanel)magnifiedPanel.clone();
125            return o;
126        }
127    }